#ifndef FileChannel_INCLUDED
#define FileChannel_INCLUDED

#include "channel.h"
#include "loggerpriority.h"
#include <string>
#include <fstream>

using std::string;
using std::fstream;

enum RotateTimeUnit
{
    ROTATE_HOUR = 0,
    ROTATE_DAY,
    ROTATE_WEEK,
    ROTATE_MONTH,
    ROTATE_YEAR
};

// 第一次滚动比较懒惰,可能不到一个小时，或者一个月就滚了
// 按月时，不能超过11个月
class FileChannel: public Channel
{
public:
    // prefpath: 仅是文件合前缀，会自己加上文件名后缀
    // preftime: 格式参见 strftime
    // prefms: preftime 是否包含毫秒
    FileChannel(const string& prefpath,const string& preftime = "%Y-%m-%d %H:%M:%S",
            const string& prefproc = "%P-%I-[%p]:",bool prefms = true);
    ~FileChannel();
    
    virtual void close();
    
    virtual Channel_Type type()
    {
        return Channel_Type_File;
    };
    
    virtual void log(const LogMsg& msg);

    ///   * %p - message priority (fatal, error, warning, info, debug, trace)
    ///   * %P - message process identifier
    ///   * %I - message thread identifier (numeric)
    ///   * preftime 的格式参考 strftime
    void  setPrefixOption(const string& preftime,const string& prefproc)
    {
        m_preftime = preftime;
        m_prefproc = prefproc;
    }
    
    void setRotateSize(const string& rsize);
    /// 格式 1K,100M,1G
    
    void setRotateTime(const string& rtime);
    /// 格式说明:
    /// 2h : 2小时,按整点(考虑到按大小滚动,可能不为整点)
    /// 2d : 2天
    /// 2w : 2周
    /// 2m : 2月
    
    /// 滚动处理，使 logger 也可以滚动,logger 中有线程，可以统计时间
    void rotate();

private:
    virtual void open();
    /// 日志前缀
    string  getPrefix(LogPriority prio,int tid);
    /// 生成文件名后缀
    string  genFileName();
private:
    fstream*            m_pFile;
    string              m_path;
    unsigned long       m_filesize;
    
    string              m_preftime;
    string              m_prefproc;
    bool                m_prefms;
    
    // 按大小和按日期可以同时起作用
    // 按大小滚动
    unsigned long       m_rotatesize;
    // 按时间(秒)
    RotateTimeUnit      m_rtimeUnit;
    unsigned int        m_rtimeCount;
    time_t              m_lastrtime;
};

#endif





